package com.sharemarking.wa.platform.controller.advice;


import com.sharemarking.wa.common.ResponseParams;
import com.sharemarking.wa.common.SysHttpStatus;
import com.sharemarking.wa.common.exception.*;
import com.sharemarking.wa.platform.controller.IndexController;
import com.sharemarking.wa.platform.dto.ExceptionResponse;
import com.sharemarking.wa.platform.exception.MicroProgramSessionExpiredException;
import com.sharemarking.wa.platform.exception.MicroProgramSignatureException;
import com.sharemarking.wa.platform.exception.PermissionDeniedException;
import com.sharemarking.wa.platform.exception.TokenExpiredException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@ControllerAdvice(basePackageClasses= {IndexController.class})
public class ControllerExceptionAdvice {


	@Autowired
    HttpServletRequest request;

	private Logger logger= LoggerFactory.getLogger(ControllerExceptionAdvice.class);

//	@ExceptionHandler(Exception.class)
//	@ResponseBody
//	public ResponseEntity<ExceptionResponse> defaultErrorHandler(Exception e) throws Exception {
//        e.printStackTrace();
//        ExceptionResponse er=new ExceptionResponse();
//		er.setErrCode("500000");
//		er.setErrMsg("未知错误");
//        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(er);
//    }
	
	@ExceptionHandler(MicroProgramSessionExpiredException.class)
	@ResponseBody
	public ResponseEntity<ExceptionResponse> defaultErrorHandler(MicroProgramSessionExpiredException e) {
		ExceptionResponse er=new ExceptionResponse();
		er.setErrCode("10007");
		er.setErrMsg("未登录");
        logger.error("接口：" + request.getRequestURL().toString());
        logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
        logger.error("错误日志：",e);
		return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(er);
    }
	
	@ExceptionHandler(TokenExpiredException.class)
	@ResponseBody
	public ResponseEntity<ExceptionResponse> defaultErrorHandler(TokenExpiredException e) {
		ExceptionResponse er=new ExceptionResponse();
		er.setErrCode("401001");
		er.setErrMsg("未绑定");
        logger.error("接口：" + request.getRequestURL().toString());
        logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
        logger.error("错误日志：",e);
		return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(er);
    }

	@ExceptionHandler(MicroProgramSignatureException.class)
	@ResponseBody
	public ResponseEntity<ExceptionResponse> defaultErrorHandler(MicroProgramSignatureException e) {
		ExceptionResponse er=new ExceptionResponse();
		er.setErrCode("403101");
		er.setErrMsg("小程序授权失败");
        logger.error("接口：" + request.getRequestURL().toString());
        logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
        logger.error("错误日志：",e);
		return ResponseEntity.status(HttpStatus.FORBIDDEN).body(er);
    }
	
	@ExceptionHandler(PermissionDeniedException.class)
	@ResponseBody
	public ResponseEntity<ExceptionResponse> defaultErrorHandler(PermissionDeniedException e) {
		ExceptionResponse er=new ExceptionResponse();
		er.setErrCode("403001");
		er.setErrMsg("缺少相关权限");
        logger.error("接口：" + request.getRequestURL().toString());
        logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
        logger.error("错误日志：",e);
		return ResponseEntity.status(HttpStatus.FORBIDDEN).body(er);
    }

	/**
	 * 500 所有非自定义异常 全部监听为系统异常
	 * @param e 捕捉到的异常
	 * @return ResponseEntity
	 * @throws Exception
	 * 系统异常（代码出BUG了）
	 */
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public ResponseEntity<ResponseParams<Object>> defaultErrorHandler(Exception e) throws Exception {
		logger.error("==============================="+new Date()+ "==================================");
		logger.error("===============================500 异常 Exception==================================");
		logger.error("===============================系统异常==================================");
		logger.error("接口：" + request.getRequestURL().toString());
		logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
		logger.error("错误日志：",e);

		e.printStackTrace();
		return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ResponseParams.error(SysHttpStatus.ERROR));
	}

	/**
	 * @param e 授权异常/登录异常 _token失效，需要重新登陆
	 * @return ResponseEntity
	 */
	@ExceptionHandler(AuthException.class)
	@ResponseBody
	public ResponseEntity<ResponseParams<?>> defaultErrorHandler(AuthException e) {
		logger.error("==============================="+new Date()+ "==================================");
		logger.error("===============================401 异常 AuthException==================================");
		logger.error("==============================="+e.getResponseParams().getErrCode()+":"+e.getResponseParams().getErrMsg()+"==================================");
		logger.error("接口：" + request.getRequestURL().toString());
		logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
		logger.error("错误日志：",e);
		e.printStackTrace();
		return ResponseEntity.status(AuthException.HTTPSTATUS).body(e.getResponseParams());
	}

	/**
	 * @param e 权限不足 _token未失效，但对资源没有权限
	 * @return ResponseEntity
	 */
	@ExceptionHandler(ForbiddenException.class)
	@ResponseBody
	public ResponseEntity<ResponseParams<?>> defaultErrorHandler(ForbiddenException e) {
		logger.error("==============================="+new Date()+ "==================================");
		logger.error("===============================403 异常 ForbiddenException==================================");
		logger.error("==============================="+e.getResponseParams().getErrCode()+":"+e.getResponseParams().getErrMsg()+"==================================");
		logger.error("接口：" + request.getRequestURL().toString());
		logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
		logger.error("错误日志：",e);
		e.printStackTrace();
		return ResponseEntity.status(ForbiddenException.HTTPSTATUS).body(e.getResponseParams());
	}

	/**
	 * @param e 请求异常（参数不完整，参数错误等）
	 * @return ResponseEntity
	 */
	@ExceptionHandler(RequestException.class)
	@ResponseBody
	public ResponseEntity<ResponseParams<?>> defaultErrorHandler(RequestException e) {
		logger.error("==============================="+new Date()+ "==================================");
		logger.error("===============================400 异常 RequestException==================================");
		logger.error("==============================="+e.getResponseParams().getErrCode()+":"+e.getResponseParams().getErrMsg()+"==================================");
		logger.error("接口：" + request.getRequestURL().toString());
		logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
		logger.error("错误日志：",e);

		e.printStackTrace();
		return ResponseEntity.status(RequestException.HTTPSTATUS).body(e.getResponseParams());
	}


	/**
	 * @param e 企业认证失败或未认证
	 * @return ResponseEntity
	 */
	@ExceptionHandler(OrgException.class)
	@ResponseBody
	public ResponseEntity<ResponseParams<?>> orgException(OrgException e) {
		logger.error("==============================="+new Date()+ "==================================");
		logger.error("===============================417 异常 ForbiddenException==================================");
		logger.error("==============================="+e.getResponseParams().getErrCode()+":"+e.getResponseParams().getErrMsg()+"==================================");
		logger.error("接口：" + request.getRequestURL().toString());
		logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
		logger.error("错误日志：",e);
		e.printStackTrace();
		return ResponseEntity.status(OrgException.HTTPSTATUS).body(e.getResponseParams());
	}

	/**
	 * @param e 司机认证失败或未认证
	 * @return ResponseEntity
	 */
	@ExceptionHandler(DriverException.class)
	@ResponseBody
	public ResponseEntity<ResponseParams<?>> driverException(DriverException e) {
		logger.error("==============================="+new Date()+ "==================================");
		logger.error("===============================417 异常 ForbiddenException==================================");
		logger.error("==============================="+e.getResponseParams().getErrCode()+":"+e.getResponseParams().getErrMsg()+"==================================");
		logger.error("接口：" + request.getRequestURL().toString());
		logger.error("请求参数：" + JSONObject.fromObject(request.getParameterMap()).toString());
		logger.error("错误日志：",e);
		e.printStackTrace();
		return ResponseEntity.status(DriverException.HTTPSTATUS).body(e.getResponseParams());
	}
}
